{
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "![](https://images2017.cnblogs.com/blog/1182370/201709/1182370-20170902065255655-264716312.png)\n",
    "\n",
    "python2.6版本中后引入的一个简单的绘图工具，叫做海龟绘图(Turtle Graphics),turtle库是python的内部库,使用导入即可 `import turtle`\n",
    "\n",
    "先说明一下turtle绘图的基础知识:\n",
    "\n",
    "## 1\\. 画布(canvas)\n",
    "\n",
    "画布就是turtle为我们展开用于绘图区域, 我们可以设置它的大小和初始位置\n",
    "\n",
    "### 1.1 设置画布大小\n",
    "\n",
    "**turtle.screensize(canvwidth=None, canvheight=None, bg=None)**\n",
    "参数分别为画布的宽(单位像素), 高, 背景颜色\n",
    "\n",
    "如:\n",
    "\n",
    "```\n",
    "turtle.screensize(800, 600, \"green\")\n",
    "turtle.screensize() #返回默认大小(400, 300)\n",
    "```\n",
    "\n",
    "**turtle.setup(width=0.5, height=0.75, startx=None, starty=None)**\n",
    "\n",
    "参数:\n",
    "width, height: 输入宽和高为整数时, 表示像素; 为小数时, 表示占据电脑屏幕的比例\n",
    "(startx, starty): 这一坐标表示 矩形窗口左上角顶点的位置, 如果为空,则窗口位于屏幕中心\n",
    "\n",
    "如:\n",
    "\n",
    "```\n",
    "turtle.setup(width=0.6, height=0.6)\n",
    "turtle.setup(width=800, height=800, startx=100, starty=100)\n",
    "```\n",
    "\n",
    "## 2\\. 画笔\n",
    "\n",
    "### 2.1 画笔的状态\n",
    "\n",
    "在画布上,默认有一个坐标原点为画布中心的坐标轴, 坐标原点上有一只面朝x轴正方向小乌龟. 这里我们描述小乌龟时使用了两个词语:`坐标原点`(位置),`面朝x轴正方向`(方向), turtle绘图中, 就是使用位置方向描述小乌龟(画笔)的状态\n",
    "\n",
    "### 2.2 画笔的属性\n",
    "\n",
    "画笔(画笔的属性，颜色、画线的宽度)\n",
    "\n",
    "1.  turtle.pensize()：设置画笔的宽度；\n",
    "2.  turtle.pencolor(); 没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如\"green\", \"red\",也可以是RGB 3元组,\n",
    "\n",
    "```\n",
    "    >>> pencolor('brown')\n",
    "    >>> tup = (0.2, 0.8, 0.55)\n",
    "    >>> pencolor(tup)\n",
    "    >>> pencolor()\n",
    "    '#33cc8c'\n",
    "```\n",
    "\n",
    "3.  turtle.speed(speed): 设置画笔移动速度,画笔绘制的速度范围\\[0,10\\]整数, 数字越大越快\n",
    "\n",
    "### 2.3 绘图命令\n",
    "\n",
    "操纵海龟绘图有着许多的命令,这些命令可以划分为3种:一种为运动命令，一种为画笔控制命令,还有一种是全局控制命令\n",
    "\n",
    "(1)画笔运动命令:\n",
    "\n",
    "| 命令 | 说明 |\n",
    "| --- | --- |\n",
    "| turtle.forward(distance) | 向当前画笔方向移动distance像素长 |\n",
    "| turtle.backward(distance) | 向当前画笔相反方向移动distance像素长度 |\n",
    "| turtle.right(degree) | 顺时针移动degree° |\n",
    "| turtle.left(degree) | 逆时针移动degree° |\n",
    "| turtle.pendown() | 移动时绘制图形,缺省时也为绘制 |\n",
    "| turtle.goto(x,y) | 将画笔移动到坐标为x,y的位置 |\n",
    "| turtle.penup() | 移动时不绘制图形,提起笔，用于另起一个地方绘制时用 |\n",
    "| turtle.speed(speed) | 画笔绘制的速度范围\\[0,10\\]整数 |\n",
    "| turtle.circle() | 画圆,半径为正(负),表示圆心在画笔的左边(右边)画圆 |\n",
    "\n",
    "(2)画笔控制命令:\n",
    "\n",
    "| 命令 | 说明 |\n",
    "| --- | --- |\n",
    "| turtle.pensize(width) | 绘制图形时的宽度 |\n",
    "| turtle.pencolor() | 画笔颜色 |\n",
    "| turtle.fillcolor(colorstring) | 绘制图形的填充颜色 |\n",
    "| turtle.color(color1, color2) | 同时设置pencolor=color1, fillcolor=color2 |\n",
    "| turtle.filling() | 返回当前是否在填充状态 |\n",
    "| turtle.begin\\_fill() | 准备开始填充图形 |\n",
    "| turtle.end\\_fill() | 填充完成； |\n",
    "| turtle.hideturtle() | 隐藏箭头显示； |\n",
    "| turtle.showturtle() | 与hideturtle()函数对应 |\n",
    "\n",
    "(3) 全局控制命令\n",
    "\n",
    "| 命令 | 说明 |\n",
    "| --- | --- |\n",
    "| turtle.clear() | 清空turtle窗口，但是turtle的位置和状态不会改变 |\n",
    "| turtle.reset() | 清空窗口，重置turtle状态为起始状态 |\n",
    "| turtle.undo() | 撤销上一个turtle动作 |\n",
    "| turtle.isvisible() | 返回当前turtle是否可见 |\n",
    "| stamp() | 复制当前图形 |\n",
    "| turtle.write(s\\[,font=(\"font-name\",font\\_size,\"font\\_type\")\\]) | 写文本，s为文本内容，font是字体的参数，里面分别为字体名称，大小和类型；font为可选项, font的参数也是可选项 |\n",
    "\n",
    "## 3\\. 命令详解\n",
    "\n",
    "3.1 turtle.circle(radius, extent=None, steps=None)\n",
    "描述: 以给定半径画圆\n",
    "参数:\n",
    "radius(半径); 半径为正(负),表示圆心在画笔的左边(右边)画圆\n",
    "extent(弧度) (optional);\n",
    "steps (optional) (做半径为radius的圆的内切正多边形,多边形边数为steps)\n",
    "\n",
    "举例:\n",
    "circle(50) # 整圆;\n",
    "circle(50,steps=3) # 三角形;\n",
    "circle(120, 180) # 半圆\n",
    "\n",
    "## 4\\. 绘图举例\n",
    "\n",
    "### 4.1 太阳花\n",
    "\n",
    "![sun](https://images2015.cnblogs.com/blog/1182370/201706/1182370-20170622135946085-1323132954.png)\n",
    "\n",
    "```\n",
    "import turtle as t\n",
    "import time\n",
    "t.color(\"red\", \"yellow\")\n",
    "t.speed(10)\n",
    "t.begin_fill()\n",
    "for _ in range(50):\n",
    "    t.forward(200)\n",
    "    t.left(170)\n",
    "t.end_fill()\n",
    "time.sleep(1)\n",
    "```\n",
    "\n",
    "### 4.2 绘制小蟒蛇\n",
    "\n",
    "![snack](https://images2015.cnblogs.com/blog/1182370/201706/1182370-20170622135945804-475120318.jpg)\n",
    "\n",
    "```\n",
    "import turtle\n",
    "\n",
    "def drawSnake(rad, angle, len, neckrad):\n",
    "    for _ in range(len):\n",
    "        turtle.circle(rad, angle)\n",
    "        turtle.circle(-rad, angle)\n",
    "    turtle.circle(rad, angle/2)\n",
    "    turtle.forward(rad/2)  # 直线前进\n",
    "    turtle.circle(neckrad, 180)\n",
    "    turtle.forward(rad/4)\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "   turtle.setup(1500, 1400, 0, 0)\n",
    "   turtle.pensize(30)  # 画笔尺寸\n",
    "   turtle.pencolor(\"green\")\n",
    "   turtle.seth(-40)    # 前进的方向\n",
    "   drawSnake(70, 80, 2, 15)\n",
    "```\n",
    "\n",
    "### 4.3 绘制五角星\n",
    "\n",
    "![sart](https://images2015.cnblogs.com/blog/1182370/201706/1182370-20170622135946007-1085775446.jpg)\n",
    "\n",
    "```\n",
    "import turtle\n",
    "import time\n",
    "\n",
    "\n",
    "turtle.pensize(5)\n",
    "turtle.pencolor(\"yellow\")\n",
    "turtle.fillcolor(\"red\")\n",
    "\n",
    "turtle.begin_fill()\n",
    "\n",
    "for _ in range(5):\n",
    "    turtle.forward(200)\n",
    "    turtle.right(144)\n",
    "turtle.end_fill()\n",
    "time.sleep(2)\n",
    "\n",
    "turtle.penup()\n",
    "turtle.goto(-150,-120)\n",
    "turtle.color(\"violet\")\n",
    "turtle.write(\"Done\", font=('Arial', 40, 'normal'))\n",
    "time.sleep(1)\n",
    "```\n",
    "\n",
    "### 4.4 小猪佩奇\n",
    "\n",
    "感谢[江城青椒肉丝](https://home.cnblogs.com/u/495104/)的小猪佩奇, 很传神:)\n",
    "\n",
    "![](https://img2018.cnblogs.com/blog/1182370/201810/1182370-20181009201504816-58418724.png)\n",
    "\n",
    "```\n",
    "# coding:utf-8\n",
    "import turtle as t\n",
    "# 绘制小猪佩奇\n",
    "# =======================================\n",
    "\n",
    "t.pensize(4)\n",
    "t.hideturtle()\n",
    "t.colormode(255)\n",
    "t.color((255, 155, 192), \"pink\")\n",
    "t.setup(840, 500)\n",
    "t.speed(10)\n",
    "\n",
    "# 鼻子\n",
    "t.pu()\n",
    "t.goto(-100,100)\n",
    "t.pd()\n",
    "t.seth(-30)\n",
    "t.begin_fill()\n",
    "a = 0.4\n",
    "for i in range(120):\n",
    "    if 0 <= i < 30 or 60 <= i < 90:\n",
    "        a = a+0.08\n",
    "        t.lt(3)  # 向左转3度\n",
    "        t.fd(a)  # 向前走a的步长\n",
    "    else:\n",
    "        a = a-0.08\n",
    "        t.lt(3)\n",
    "        t.fd(a)\n",
    "        t.end_fill()\n",
    "\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(25)\n",
    "t.seth(0)\n",
    "t.fd(10)\n",
    "t.pd()\n",
    "t.pencolor(255, 155, 192)\n",
    "t.seth(10)\n",
    "t.begin_fill()\n",
    "t.circle(5)\n",
    "t.color(160, 82, 45)\n",
    "t.end_fill()\n",
    "\n",
    "t.pu()\n",
    "t.seth(0)\n",
    "t.fd(20)\n",
    "t.pd()\n",
    "t.pencolor(255, 155, 192)\n",
    "t.seth(10)\n",
    "t.begin_fill()\n",
    "t.circle(5)\n",
    "t.color(160, 82, 45)\n",
    "t.end_fill()\n",
    "\n",
    "# 头\n",
    "t.color((255, 155, 192), \"pink\")\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(41)\n",
    "t.seth(0)\n",
    "t.fd(0)\n",
    "t.pd()\n",
    "t.begin_fill()\n",
    "t.seth(180)\n",
    "t.circle(300, -30)\n",
    "t.circle(100, -60)\n",
    "t.circle(80, -100)\n",
    "t.circle(150, -20)\n",
    "t.circle(60, -95)\n",
    "t.seth(161)\n",
    "t.circle(-300, 15)\n",
    "t.pu()\n",
    "t.goto(-100, 100)\n",
    "t.pd()\n",
    "t.seth(-30)\n",
    "a = 0.4\n",
    "for i in range(60):\n",
    "    if 0 <= i < 30 or 60 <= i <90:\n",
    "        a = a+0.08\n",
    "        t.lt(3)  # 向左转3度\n",
    "        t.fd(a)  # 向前走a的步长\n",
    "    else:\n",
    "        a = a-0.08\n",
    "        t.lt(3)\n",
    "        t.fd(a)\n",
    "        t.end_fill()\n",
    "\n",
    "# 耳朵\n",
    "t.color((255, 155, 192), \"pink\")\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(-7)\n",
    "t.seth(0)\n",
    "t.fd(70)\n",
    "t.pd()\n",
    "t.begin_fill()\n",
    "t.seth(100)\n",
    "t.circle(-50, 50)\n",
    "t.circle(-10, 120)\n",
    "t.circle(-50, 54)\n",
    "t.end_fill()\n",
    "\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(-12)\n",
    "t.seth(0)\n",
    "t.fd(30)\n",
    "t.pd()\n",
    "t.begin_fill()\n",
    "t.seth(100)\n",
    "t.circle(-50, 50)\n",
    "t.circle(-10, 120)\n",
    "t.circle(-50, 56)\n",
    "t.end_fill()\n",
    "\n",
    "#眼睛\n",
    "t.color((255, 155, 192), \"white\")\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(-20)\n",
    "t.seth(0)\n",
    "t.fd(-95)\n",
    "t.pd()\n",
    "t.begin_fill()\n",
    "t.circle(15)\n",
    "t.end_fill()\n",
    "\n",
    "t.color(\"black\")\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(12)\n",
    "t.seth(0)\n",
    "t.fd(-3)\n",
    "t.pd()\n",
    "t.begin_fill()\n",
    "t.circle(3)\n",
    "t.end_fill()\n",
    "\n",
    "t.color((255, 155, 192), \"white\")\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(-25)\n",
    "t.seth(0)\n",
    "t.fd(40)\n",
    "t.pd()\n",
    "t.begin_fill()\n",
    "t.circle(15)\n",
    "t.end_fill()\n",
    "\n",
    "t.color(\"black\")\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(12)\n",
    "t.seth(0)\n",
    "t.fd(-3)\n",
    "t.pd()\n",
    "t.begin_fill()\n",
    "t.circle(3)\n",
    "t.end_fill()\n",
    "\n",
    "# 腮\n",
    "t.color((255, 155, 192))\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(-95)\n",
    "t.seth(0)\n",
    "t.fd(65)\n",
    "t.pd()\n",
    "t.begin_fill()\n",
    "t.circle(30)\n",
    "t.end_fill()\n",
    "\n",
    "# 嘴\n",
    "t.color(239, 69, 19)\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(15)\n",
    "t.seth(0)\n",
    "t.fd(-100)\n",
    "t.pd()\n",
    "t.seth(-80)\n",
    "t.circle(30, 40)\n",
    "t.circle(40, 80)\n",
    "\n",
    "# 身体\n",
    "t.color(\"red\", (255, 99, 71))\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(-20)\n",
    "t.seth(0)\n",
    "t.fd(-78)\n",
    "t.pd()\n",
    "t.begin_fill()\n",
    "t.seth(-130)\n",
    "t.circle(100,10)\n",
    "t.circle(300,30)\n",
    "t.seth(0)\n",
    "t.fd(230)\n",
    "t.seth(90)\n",
    "t.circle(300,30)\n",
    "t.circle(100,3)\n",
    "t.color((255,155,192),(255,100,100))\n",
    "t.seth(-135)\n",
    "t.circle(-80,63)\n",
    "t.circle(-150,24)\n",
    "t.end_fill()\n",
    "\n",
    "# 手\n",
    "t.color((255,155,192))\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(-40)\n",
    "t.seth(0)\n",
    "t.fd(-27)\n",
    "t.pd()\n",
    "t.seth(-160)\n",
    "t.circle(300,15)\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(15)\n",
    "t.seth(0)\n",
    "t.fd(0)\n",
    "t.pd()\n",
    "t.seth(-10)\n",
    "t.circle(-20,90)\n",
    "\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(30)\n",
    "t.seth(0)\n",
    "t.fd(237)\n",
    "t.pd()\n",
    "t.seth(-20)\n",
    "t.circle(-300,15)\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(20)\n",
    "t.seth(0)\n",
    "t.fd(0)\n",
    "t.pd()\n",
    "t.seth(-170)\n",
    "t.circle(20,90)\n",
    "\n",
    "# 脚\n",
    "t.pensize(10)\n",
    "t.color((240,128,128))\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(-75)\n",
    "t.seth(0)\n",
    "t.fd(-180)\n",
    "t.pd()\n",
    "t.seth(-90)\n",
    "t.fd(40)\n",
    "t.seth(-180)\n",
    "t.color(\"black\")\n",
    "t.pensize(15)\n",
    "t.fd(20)\n",
    "\n",
    "t.pensize(10)\n",
    "t.color((240, 128, 128))\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(40)\n",
    "t.seth(0)\n",
    "t.fd(90)\n",
    "t.pd()\n",
    "t.seth(-90)\n",
    "t.fd(40)\n",
    "t.seth(-180)\n",
    "t.color(\"black\")\n",
    "t.pensize(15)\n",
    "t.fd(20)\n",
    "\n",
    "# 尾巴\n",
    "t.pensize(4)\n",
    "t.color((255, 155, 192))\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(70)\n",
    "t.seth(0)\n",
    "t.fd(95)\n",
    "t.pd()\n",
    "t.seth(0)\n",
    "t.circle(70, 20)\n",
    "t.circle(10, 330)\n",
    "t.circle(70, 30)\n",
    "t.done()\n",
    "```"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}